home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2010 April / PCWorld0410.iso / hity wydania / Ubuntu 9.10 PL / karmelkowy-koliberek-desktop-9.10-i386-PL.iso / casper / filesystem.squashfs / usr / sbin / pam_getenv < prev    next >
Text File  |  2009-09-04  |  3KB  |  124 lines

  1. #!/usr/bin/perl -w
  2.  
  3. =head1 NAME
  4.  
  5. pam_getenv - get environment variables from /etc/environment
  6.  
  7. =head1 SYNOPSIS
  8.  
  9. pam_getenv B<[-l] [-s]> I<env_var>
  10.  
  11. =head1 DESCRIPTION
  12.  
  13. This tool  will print out the value of I<env_var> from F</etc/environment>.  It will attempt to expand environment variable references in the definition of I<env_var> but will fail if PAM items are expanded.
  14.  
  15. The B<-l> option indicates the script should return an environment variable related to default locale information.
  16.  
  17. The B<-s> option indicates that the script should return an
  18. system default environment variable.
  19.  
  20. Currently neither the B<-l> or B<-s> options do anything.  They are
  21. included because future versions of Debian may have a separate
  22. repository for the initial environment used by init scripts and for
  23. system locale information.  These options will allow this script to be
  24. a stable interface even in that environment.
  25.  
  26. =cut
  27.  
  28. # Copyright 2004 by Sam Hartman
  29. # This script may be copied under the terms of the GNU GPL
  30. # version 2, or at your option any later version.
  31.  
  32. use strict;
  33. use vars qw(*CONFIGFILE *ENVFILE);
  34.  
  35. sub read_line($) {
  36.   my $fh = shift;
  37.   my $line;
  38.   local $_;
  39.   line: while (<$fh>) {
  40.     chomp;
  41.     s/^\s+//;
  42. s/\#.*$//;
  43.     next if $_ eq "";
  44.     if (s/\\\s*$//) {
  45.       $line .= $_;
  46.       next line;
  47.     }
  48.  
  49.     $line .= $_;
  50.     last;
  51.   }
  52.   $line;
  53.   
  54. }
  55.  
  56.  
  57. sub parse_line($) {
  58.   my $var;
  59.   my (%x, @x);
  60.   local $_ = shift;
  61.   return undef unless defined $_ and s/(\S+)\s//;
  62.   $var->{Name} = $1;
  63.   s/^\s*//;
  64.   @x = split(/=([^"\s]\S*|"[^"]*")\s*/, $_);
  65.   unless (scalar(@x)%2 == 0) {
  66.     push @x, undef;
  67.   }
  68.   %x = @x;
  69.   @{$var}{"Default", "Override"} =
  70.     @x{"DEFAULT", "OVERRIDE"};
  71.   $var;
  72. }
  73.  
  74. sub expand_val($) {
  75.   my ($val) = @_;
  76. return undef unless $val;
  77.     die "Cannot handle PAM items\n" if /(?<!\\)\@/;
  78.   $val =~ s/(?<!\\)\${([^}]+)}/$ENV{$1}||""/eg;
  79.   return $val;
  80. }
  81.  
  82. my $lookup;
  83.  
  84. while ($_ = shift) {
  85.   next if $_ eq "-s";
  86.   next if $_ eq "-l";
  87.   $lookup = $_;
  88.   last;
  89. }
  90. unless (defined $lookup) {
  91.   die "Usage: pam_getenv [-l] [-s] env_var\n";
  92. }
  93.  
  94. my %allvars;
  95.  
  96. open (CONFIGFILE, "/etc/security/pam_env.conf")
  97.   or die "Cannot open environment file: $!\n";
  98.  
  99. while (my $var = parse_line(read_line(\*CONFIGFILE))) {
  100.   my $val;
  101.   unless ($val = expand_val($var->{Override})) {
  102.     $val = expand_val($var->{Default});
  103.   }
  104.   $allvars{$var->{Name}} = $val;
  105. }
  106.  
  107. if (open (ENVFILE, "/etc/environment")) {
  108.   while (my $line = read_line(\*ENVFILE)) {
  109.     $line =~ s/^export //;
  110.     $line =~ /(.*?)=(.+)/ or next;
  111.     my ($var, $val) = ($1, $2);
  112.     # This is bizarre logic (" and ' match each other, quotes are only
  113.     # significant at the start and end of the string, and the trailing quote
  114.     # may be omitted), but it's what pam_env does.
  115.     $val =~ s/^["'](.*?)["']?$/$1/;
  116.     $allvars{$var} = $val;
  117.   }
  118. }
  119.  
  120. if (exists $allvars{$lookup}) {
  121.   print $allvars{$lookup}, "\n";
  122.   exit(0);
  123. }
  124.